package com.kgc.scd.controller;

import com.kgc.scd.annotation.RequestUser;
import com.kgc.scd.bean.Sign;
import com.kgc.scd.bean.SignVO;
import com.kgc.scd.service.SignService;
import com.kgc.scd.service.UserService;
import com.kgc.scd.util.RequestResult;
import com.kgc.scd.util.UserAnno;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Created On : 2022/6/9.
 * <p>
 * Author     : nainai
 * <p>
 * Description: 用户积分操作入口
 */
@Slf4j
@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private SignService signService;

    /**
     * @author : nainai
     * @date   : 2022/6/9
     * @param  : [java.lang.Integer]
     * @return : com.kgc.scd.util.RequestResult<com.kgc.scd.bean.User>
     * @description : 查询用户积分
     */
    @PostMapping("/queryUserCredit")
    public Integer queryUserCredit(@RequestBody UserAnno user){
        log.info("查询用户编号为：{}的积分", user.getUserId());

        // 调用业务接口，查询用户积分
        return userService.getCreditById(user.getUserId());
    }

    /**
     * @author : nainai
     * @date   : 2022/6/10
     * @param  : [java.lang.Integer, java.lang.Double]
     * @return : com.kgc.scd.util.RequestResult<java.lang.String>
     * @description : 订单完成进行结算积分
     */
    @PostMapping("/creditSettlement")
    public boolean creditSettlement(@RequestParam String userId, @RequestParam double proPrice){
        log.info("开始结算积分，用户：{}, 消费金额：{}", userId, proPrice);
        // 计算积分，每一元算一积分
        int credit = 0;
        if (proPrice > 0){
            credit = (int) (Math.floor(proPrice));
        }

        // 调用业务接口，用户增加积分
        if (userService.addCredit(userId, credit)){
            log.info("积分结算结束，用户：{}，消费金额：{}，获得积分：{}", userId, proPrice, credit);
            return true;
        }

        // 增加积分失败
        return false;
    }

    /**
     * @author : nainai
     * @date   : 2022/6/10
     * @param  : [java.lang.Integer, java.lang.Integer]
     * @return : com.kgc.scd.util.RequestResult<java.lang.String>
     * @description : 扣减积分，当发生退款时，或者进行优惠券购买时，进行积分扣减
     */
    @PostMapping("/creditDeduct")
    public boolean creditDeduct(@RequestParam String userId, @RequestParam Integer credit){
        log.info("开始积分扣减，用户：{}，扣减积分：{}", userId, credit);

        // 判断需要扣减的积分是否大于0
        if (credit < 0){
            credit = 0;
        }

        // 扣减前判断积分是否足够
        if (credit > userService.getCreditById(userId)){
            log.info("用户积分不足，无法扣减");
            return false;
        }

        // 调动业务接口，扣减积分
        if (userService.subCredit(userId, credit)) {
            log.info("扣减积分成功！");
            return true;
        }

        // 扣减积分失败
        return false;
    }

    /**
     * @author : nainai
     * @date   : 2022/6/14
     * @param  : [java.lang.String, java.lang.Integer]
     * @return : boolean
     * @description : 用户增加积分
     */
    @PostMapping("/addUserCredit")
    public boolean addUserCredit(@RequestParam String userId, @RequestParam Integer credit){
        log.info("用户：{}，增加积分：{}", userId, credit);

        // 判断积分是否为有效参数
        if (credit < 0) {
            return false;
        }
        return userService.addUserCredit(userId, credit);
    }

    /**
     * @author : nainai
     * @date   : 2022/6/10
     * @param  : [java.lang.Integer]
     * @return : com.kgc.scd.util.RequestResult<java.lang.String>
     * @description : 用户签到
     */
    @PostMapping("/userSign")
    public Map<String, String> consecutiveSign(@RequestParam String userId){
        // 调用业务接口，用户进行签到
        return userService.UserSign(userId);
    }

    /**
     * @author : nainai
     * @date   : 2022/6/16
     * @param  : [java.lang.String, java.lang.Integer, java.lang.Integer]
     * @return : java.util.List<com.kgc.scd.bean.Sign>
     * @description : 查询用户签到流水
     */
    @GetMapping("/queryUserSignRecord")
    public List<SignVO> queryUserSignRecord(@RequestParam String userId, @RequestParam Integer year, @RequestParam(required = false) Integer month) {
        log.info("用户：{}，正在查询签到流水，年：{}，月：{}", userId, year, month);

        // 月如果为空查询整年
        List<Sign> signs = signService.queryUserSignRecord(userId, year, month);

        // 定义返回结果集
        List<SignVO> signVOs = new ArrayList<>();

        for (Sign s : signs) {
            SignVO signVO = new SignVO();
            BeanUtils.copyProperties(s, signVO);
            signVOs.add(signVO);
        }
        return signVOs;
    }
}
